package pe.edu.upc.dai.grupo4.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import pe.edu.upc.dai.grupo4.model.Usuario;
import pe.edu.upc.dai.grupo4.utils.*;

/**
 *
 * @author pcsilshi
 */
public class UsuarioDaoImpl implements UsuarioDao {

    public Usuario seleccionarPorPrimaryKey(Integer idUsuario) {
        Usuario usuario = null;
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("{call dbo.usp_CONC_Bancos_SEL_x_Id_Usuario(?)}");
            st.setInt(1, idUsuario);
            rs = st.executeQuery();
            if (rs.next()) {
                usuario = this.mapResultSet(rs);
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return usuario;
    }

    public Usuario seleccionarPorUsuario(String user) {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        Usuario usuario = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("{call dbo.usp_Usuario_SEL_x_username(?)}");
            st.setString(1, user);
            rs = st.executeQuery();
            if (rs.next()) {
                usuario = this.mapResultSet(rs);
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return usuario;
    }

    public List<Usuario> seleccionarTodos() {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        Usuario usuario = null;
        List<Usuario> lista = new ArrayList<Usuario>();
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("{call dbo.usp_Usuario_SEL}");
            rs = st.executeQuery();
            while (rs.next()) {
                usuario = mapResultSet(rs);
                lista.add(usuario);
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return lista;
    }

    public int insertar(Usuario usuario) {
        int result = 0;
        Connection connection = null;
        CallableStatement st = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareCall("{call dbo.usp_Usuario_INS(?, ?, ?, ?, ?, ?)}");
            st.registerOutParameter(1, java.sql.Types.INTEGER);
            this.comun(st, usuario);
            st.execute();
            ConnectionUtils.commit(connection);
            result = st.getInt(1);
        } catch (SQLException e) {
            ConnectionUtils.rollback(connection);
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return result;
    }

    public int actualizar(Usuario usuario) {
        int result = 0;
        Connection connection = null;
        CallableStatement st = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareCall("{call dbo.usp_Usuario_UPD(?, ?, ?, ?, ?, ?)}");
            st.setInt(1, usuario.getIdUsuario());
            this.comun(st, usuario);
            st.execute();
            ConnectionUtils.commit(connection);
            result = st.getUpdateCount();
        } catch (SQLException e) {
            ConnectionUtils.rollback(connection);
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return result;
    }

    private void comun(PreparedStatement st, Usuario usuario) {
        try {
            st.setString(2, usuario.getUsuario());
            st.setString(3, usuario.getPassword());
            st.setString(4, usuario.getNombre());
            st.setString(5, usuario.getApellidoPaterno());
            st.setString(6, usuario.getApellidoMaterno());
        } catch (SQLException e) {
            throw new DaoException(e);
        }
    }

    public void eliminar(Usuario usuario) {
        Connection connection = null;
        PreparedStatement st = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("{call dbo.usp_Usuario_DEL(?)}");
            st.setInt(1, usuario.getIdUsuario());
            st.execute();
            ConnectionUtils.commit(connection);
        } catch (SQLException e) {
            ConnectionUtils.rollback(connection);
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
    }

    private Usuario mapResultSet(ResultSet rs) throws SQLException {
        Usuario usuario = new Usuario();
        usuario.setIdUsuario(rs.getInt("ID_USUARIO"));
        usuario.setUsuario(rs.getString("USUARIO"));
        usuario.setPassword(rs.getString("PASSWORD"));
        usuario.setNombre(rs.getString("NOMBRE"));
        usuario.setApellidoPaterno(rs.getString("APELLIDO_PATERNO"));
        usuario.setApellidoMaterno(rs.getString("APELLIDO_MATERNO"));
        return usuario;
    }
}
